# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-06-01
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.形状工具集 import 多边形工具
from 神笔码靓.神笔库.线条工具集 import 计算粘贴区域点
from 神笔码靓.神笔库.通用工具集 import *


class 几何体展开图(神笔绘图板):
    def __init__(self, 作品文件路径, 页面大小, 显示标签=是):
        宽, 高 = 页面大小
        super(几何体展开图, self).__init__(作品文件路径, 宽=宽, 高=高)
        self.初始化()
        self.顶点A, self.顶点B = self.初始顶点()
        self.显示标签 = 显示标签
        self.顶点坐标字典 = {}

    def 初始化(self):
        pass

    def 初始顶点(self):
        return 0, 0

    def 画线(self, 顶点):
        self.连直线(顶点, 闭合=True)

    def 写顶点标签(self, 顶点, x, y, 标签):
        self.写字(x, y, 标签, 字体大小=25)

    def 获取顶点坐标(self, 顶点号):
        if 顶点号 in self.顶点坐标字典:
            return self.顶点坐标字典[顶点号]
        return None

    def 顶点号构建(self, 顶点号列表):
        self.顶点坐标字典 = {}
        self.顶点坐标字典[1] = self.顶点A
        self.顶点坐标字典[2] = self.顶点B
        面列表 = 列表()
        顶点号列表集 = 列表()
        for 顶点号 in 顶点号列表:
            顶点号列表集.添加元素(列表(顶点号))

        for li, 顶点号列表 in 索引列举(顶点号列表集):
            p1 = self.顶点坐标字典[int(顶点号列表[0])]
            p2 = self.顶点坐标字典[int(顶点号列表[1])]

            if li > 0:
                顶点号列表[0] = -顶点号列表[0]
                顶点号列表[1] = -顶点号列表[1]

            构成面的点列表 = self.创建有标签的顶点(p1, p2, 标签列表=顶点号列表)
            面列表.添加元素(构成面的点列表)
            for 标签索引值, 标签 in 索引列举(顶点号列表):
                if 标签 < 0:
                    continue
                if int(标签) not in self.顶点坐标字典:
                    self.顶点坐标字典[int(标签)] = 构成面的点列表[标签索引值]
        return 面列表

    def 顶点号构建粘贴线(self, 粘贴线基础点列表, 距离=50, 角度=33, 描边样式="2,2"):
        粘贴线开始结束点集合 = []
        for 粘贴线基础点 in 粘贴线基础点列表:
            if 返回长度(粘贴线基础点) == 2:
                # 仅仅计算只有 开始编号 和 结束编号 的数据，粘贴线中间点需要计算
                开始编号, 结束编号 = 粘贴线基础点
                开始坐标 = self.获取顶点坐标(开始编号)
                结束坐标 = self.获取顶点坐标(结束编号)
                粘贴线开始结束点集合.append([开始坐标, 结束坐标])

        # 计算粘贴线中间点
        粘贴线区域点列表集 = 计算粘贴区域点(粘贴线开始结束点集合, 距离=距离, 角度=角度, 强制计算=否)
        for 粘贴线区域点列表 in 粘贴线区域点列表集:
            self.连直线(粘贴线区域点列表, 描边样式=描边样式)

    def 创建有标签的顶点(self, 点A, 点B, 标签列表):
        顶点总数 = len(标签列表)
        所有顶点 = 多边形工具.找多边形的顶点(点A, 点B, 顶点总数)

        self.画线(所有顶点)

        if self.显示标签:
            缩小后所有顶点 = 多边形工具.计算缩放顶点(所有顶点, 0.75)  # 将顶点序号写在多边形的内部
            for 序号, 顶点 in 索引列举(缩小后所有顶点):
                标签 = 标签列表[序号]
                # if 标签 < 0:
                #     continue
                x, y = 顶点
                self.写顶点标签(缩小后所有顶点, x, y, abs(标签))

        return 所有顶点

    def 页面设置(self, 设置: 纸张设置):
        # 输出 PDF 文件，以及 页面打印，在这里设置好
        设置.上页边距 = "0cm"
        设置.下页边距 = "0"
        设置.左页边距 = "0.1cm"
        设置.右页边距 = "0"
        设置.页面方向 = 纸张方向.纵向
        设置.页面尺寸规格 = "A4"
        设置.页面缩放 = 1.0

    def 创作(self):
        # 注意：图框不会显示到 PDF 文件中，如果不希望SVG文件显示图框，可以注释或者删除以下代码
        self.显示图框()
        # self.显示网格(网格线距=20, 网格颜色=颜色.暗灰色, 网格透明度=1, 网格字体大小=9)

